/**
 * 验证规则配置
 * @description 定义各种数据验证的规则和约束
 */

/**
 * 字段长度限制规则
 */
export const FIELD_LENGTH_RULES = {
  /** 学生姓名长度限制 */
  STUDENT_NAME: { min: 1, max: 50 },
  /** 学号长度限制 */
  STUDENT_ID: { min: 1, max: 20 },
  /** 年级长度限制 */
  GRADE: { min: 1, max: 20 },
  /** 班级长度限制 */
  CLASS: { min: 1, max: 20 },
  /** 家长姓名长度限制 */
  PARENT_NAME: { min: 1, max: 50 },
  /** 地址长度限制 */
  ADDRESS: { min: 1, max: 200 },
  /** 备注长度限制 */
  REMARK: { min: 0, max: 500 },
  
  /** 课程名称长度限制 */
  COURSE_NAME: { min: 1, max: 100 },
  /** 课程代码长度限制 */
  COURSE_CODE: { min: 1, max: 20 },
  /** 教师姓名长度限制 */
  TEACHER_NAME: { min: 1, max: 50 },
  /** 课程描述长度限制 */
  COURSE_DESCRIPTION: { min: 0, max: 1000 },
  /** 课程大纲长度限制 */
  COURSE_SYLLABUS: { min: 0, max: 2000 },
  /** 教室地点长度限制 */
  LOCATION: { min: 1, max: 100 }
} as const;

/**
 * 数值范围限制规则
 */
export const NUMBER_RANGE_RULES = {
  /** 学生年龄范围 */
  STUDENT_AGE: { min: 3, max: 100 },
  /** 课程时长范围（分钟） */
  COURSE_DURATION: { min: 15, max: 480 },
  /** 课程费用范围 */
  COURSE_FEE: { min: 0, max: 10000 },
  /** 单次课程费用范围 */
  SESSION_FEE: { min: 0, max: 1000 },
  /** 课程容量范围 */
  COURSE_CAPACITY: { min: 1, max: 100 },
  /** 课程总次数范围 */
  TOTAL_COUNT: { min: 1, max: 1000 },
  /** 课程序号范围 */
  SEQUENCE_NUMBER: { min: 1, max: 1000 },
  /** 最大补课次数范围 */
  MAX_MAKEUP_COUNT: { min: 0, max: 50 },
  /** 提醒提前时间范围（分钟） */
  REMINDER_ADVANCE_MINUTES: { min: 5, max: 1440 }
} as const;

/**
 * 正则表达式规则
 */
export const REGEX_RULES = {
  /** 中国大陆手机号正则 */
  PHONE: /^1[3-9]\d{9}$/,
  /** 邮箱地址正则 */
  EMAIL: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
  /** 十六进制颜色正则 */
  HEX_COLOR: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
  /** 日期格式正则 (YYYY-MM-DD) */
  DATE: /^\d{4}-\d{2}-\d{2}$/,
  /** 时间格式正则 (HH:mm) */
  TIME: /^([01]?[0-9]|2[0-3]):[0-5][0-9]$/,
  /** 学号格式正则（字母数字组合） */
  STUDENT_ID_FORMAT: /^[A-Za-z0-9]+$/,
  /** 课程代码格式正则（字母数字组合） */
  COURSE_CODE_FORMAT: /^[A-Za-z0-9-_]+$/,
  /** 中文姓名正则 */
  CHINESE_NAME: /^[\u4e00-\u9fa5]{2,10}$/,
  /** 身份证号正则 */
  ID_CARD: /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
} as const;

/**
 * 业务规则约束
 */
export const BUSINESS_RULES = {
  /** 课程时间相关规则 */
  SCHEDULE: {
    /** 最小课程时长（分钟） */
    MIN_DURATION: 15,
    /** 最大课程时长（分钟） */
    MAX_DURATION: 480,
    /** 默认课程时长（分钟） */
    DEFAULT_DURATION: 90,
    /** 课程间隔时间（分钟） */
    MIN_INTERVAL: 15,
    /** 一天最大课程数 */
    MAX_SESSIONS_PER_DAY: 10,
    /** 一周最大课程数 */
    MAX_SESSIONS_PER_WEEK: 50,
    /** 提前预约最少天数 */
    MIN_ADVANCE_DAYS: 1,
    /** 提前预约最多天数 */
    MAX_ADVANCE_DAYS: 365
  },
  
  /** 学生相关规则 */
  STUDENT: {
    /** 最小年龄 */
    MIN_AGE: 3,
    /** 最大年龄 */
    MAX_AGE: 100,
    /** 默认年龄 */
    DEFAULT_AGE: 10,
    /** 学号唯一性检查 */
    UNIQUE_STUDENT_ID: true,
    /** 同时选课最大数量 */
    MAX_CONCURRENT_COURSES: 20
  },
  
  /** 课程相关规则 */
  COURSE: {
    /** 课程代码唯一性检查 */
    UNIQUE_COURSE_CODE: true,
    /** 最大分类数量 */
    MAX_CATEGORIES: 5,
    /** 最大标签数量 */
    MAX_TAGS: 10,
    /** 最大先修课程数量 */
    MAX_PREREQUISITES: 5,
    /** 最大学习目标数量 */
    MAX_OBJECTIVES: 10
  },
  
  /** 费用相关规则 */
  FEE: {
    /** 最小费用 */
    MIN_FEE: 0,
    /** 最大费用 */
    MAX_FEE: 10000,
    /** 费用精度（小数位数） */
    DECIMAL_PLACES: 2,
    /** 支持的支付状态 */
    PAYMENT_STATUSES: ['unpaid', 'paid', 'refunded'] as const
  },
  
  /** 出勤相关规则 */
  ATTENDANCE: {
    /** 支持的出勤状态 */
    STATUSES: ['present', 'absent', 'late', 'early_leave'] as const,
    /** 迟到容忍时间（分钟） */
    LATE_TOLERANCE: 15,
    /** 早退容忍时间（分钟） */
    EARLY_LEAVE_TOLERANCE: 15
  }
} as const;

/**
 * 错误消息模板
 */
export const ERROR_MESSAGES = {
  /** 必填字段错误 */
  REQUIRED: (fieldName: string) => `${fieldName}不能为空`,
  
  /** 长度错误 */
  LENGTH_TOO_SHORT: (fieldName: string, minLength: number) => 
    `${fieldName}长度不能少于${minLength}个字符`,
  LENGTH_TOO_LONG: (fieldName: string, maxLength: number) => 
    `${fieldName}长度不能超过${maxLength}个字符`,
  
  /** 数值范围错误 */
  NUMBER_TOO_SMALL: (fieldName: string, min: number) => 
    `${fieldName}不能小于${min}`,
  NUMBER_TOO_LARGE: (fieldName: string, max: number) => 
    `${fieldName}不能大于${max}`,
  
  /** 格式错误 */
  INVALID_FORMAT: (fieldName: string) => `${fieldName}格式不正确`,
  INVALID_EMAIL: '邮箱格式不正确',
  INVALID_PHONE: '手机号格式不正确',
  INVALID_DATE: '日期格式不正确，请使用YYYY-MM-DD格式',
  INVALID_TIME: '时间格式不正确，请使用HH:mm格式',
  INVALID_COLOR: '颜色格式不正确，请使用十六进制格式（如#FF0000）',
  
  /** 业务逻辑错误 */
  TIME_CONFLICT: '该时间段已有其他课程安排',
  END_TIME_BEFORE_START: '结束时间必须晚于开始时间',
  DUPLICATE_STUDENT_ID: '学号已存在',
  DUPLICATE_COURSE_CODE: '课程代码已存在',
  INVALID_DAY_OF_WEEK: '星期几必须在1-7之间',
  PAST_DATE_NOT_ALLOWED: '不能选择过去的日期',
  
  /** 数组相关错误 */
  ARRAY_EMPTY: (fieldName: string) => `${fieldName}至少需要选择一项`,
  ARRAY_TOO_MANY: (fieldName: string, maxCount: number) => 
    `${fieldName}最多只能选择${maxCount}项`
} as const;

/**
 * 警告消息模板
 */
export const WARNING_MESSAGES = {
  /** 建议性提示 */
  SUGGEST_PHONE: '建议至少填写一个联系电话',
  SUGGEST_DESCRIPTION: '建议添加课程描述',
  SUGGEST_DURATION: '建议设置课程时长',
  SUGGEST_FEE: '建议设置课程费用',
  SUGGEST_LOCATION: '建议填写上课地点',
  
  /** 数据完整性提示 */
  INCOMPLETE_STUDENT_INFO: '学生信息不完整，建议补充联系方式',
  INCOMPLETE_COURSE_INFO: '课程信息不完整，建议补充详细描述',
  
  /** 业务提醒 */
  WEEKEND_SCHEDULE: '周末安排课程，请确认学生时间',
  EVENING_SCHEDULE: '晚间安排课程，请注意学生作息时间',
  HIGH_FREQUENCY_SCHEDULE: '课程频率较高，请注意学生学习负担',
  
  /** 费用相关提醒 */
  HIGH_FEE: '课程费用较高，请确认收费标准',
  FREE_COURSE: '免费课程，请确认是否正确'
} as const;

/**
 * 验证规则组合
 */
export const VALIDATION_RULE_SETS = {
  /** 学生基本信息验证规则 */
  STUDENT_BASIC: {
    name: {
      required: true,
      minLength: FIELD_LENGTH_RULES.STUDENT_NAME.min,
      maxLength: FIELD_LENGTH_RULES.STUDENT_NAME.max
    },
    studentId: {
      required: true,
      minLength: FIELD_LENGTH_RULES.STUDENT_ID.min,
      maxLength: FIELD_LENGTH_RULES.STUDENT_ID.max,
      pattern: REGEX_RULES.STUDENT_ID_FORMAT
    },
    phone: {
      required: false,
      pattern: REGEX_RULES.PHONE
    },
    email: {
      required: false,
      pattern: REGEX_RULES.EMAIL
    },
    age: {
      required: false,
      min: NUMBER_RANGE_RULES.STUDENT_AGE.min,
      max: NUMBER_RANGE_RULES.STUDENT_AGE.max
    }
  },
  
  /** 课程基本信息验证规则 */
  COURSE_BASIC: {
    name: {
      required: true,
      minLength: FIELD_LENGTH_RULES.COURSE_NAME.min,
      maxLength: FIELD_LENGTH_RULES.COURSE_NAME.max
    },
    courseCode: {
      required: true,
      minLength: FIELD_LENGTH_RULES.COURSE_CODE.min,
      maxLength: FIELD_LENGTH_RULES.COURSE_CODE.max,
      pattern: REGEX_RULES.COURSE_CODE_FORMAT
    },
    teacher: {
      required: true,
      minLength: FIELD_LENGTH_RULES.TEACHER_NAME.min,
      maxLength: FIELD_LENGTH_RULES.TEACHER_NAME.max
    },
    color: {
      required: true,
      pattern: REGEX_RULES.HEX_COLOR
    },
    duration: {
      required: false,
      min: NUMBER_RANGE_RULES.COURSE_DURATION.min,
      max: NUMBER_RANGE_RULES.COURSE_DURATION.max
    },
    fee: {
      required: false,
      min: NUMBER_RANGE_RULES.COURSE_FEE.min,
      max: NUMBER_RANGE_RULES.COURSE_FEE.max
    }
  },
  
  /** 课程安排验证规则 */
  SCHEDULE_TEMPLATE: {
    startDate: {
      required: true,
      pattern: REGEX_RULES.DATE
    },
    startTime: {
      required: true,
      pattern: REGEX_RULES.TIME
    },
    endTime: {
      required: true,
      pattern: REGEX_RULES.TIME
    },
    totalCount: {
      required: true,
      min: NUMBER_RANGE_RULES.TOTAL_COUNT.min,
      max: NUMBER_RANGE_RULES.TOTAL_COUNT.max
    },
    dayOfWeek: {
      required: true,
      min: 1,
      max: 7
    }
  }
} as const;

/**
 * 导出验证规则工具函数
 */

/**
 * 获取字段长度规则
 * @param fieldType 字段类型
 * @returns 长度规则
 */
export const getFieldLengthRule = (fieldType: keyof typeof FIELD_LENGTH_RULES) => {
  return FIELD_LENGTH_RULES[fieldType];
};

/**
 * 获取数值范围规则
 * @param fieldType 字段类型
 * @returns 范围规则
 */
export const getNumberRangeRule = (fieldType: keyof typeof NUMBER_RANGE_RULES) => {
  return NUMBER_RANGE_RULES[fieldType];
};

/**
 * 获取正则表达式规则
 * @param patternType 模式类型
 * @returns 正则表达式
 */
export const getRegexRule = (patternType: keyof typeof REGEX_RULES) => {
  return REGEX_RULES[patternType];
};

/**
 * 获取业务规则
 * @param ruleCategory 规则分类
 * @returns 业务规则
 */
export const getBusinessRule = (ruleCategory: keyof typeof BUSINESS_RULES) => {
  return BUSINESS_RULES[ruleCategory];
};

/**
 * 检查值是否符合正则规则
 * @param value 要检查的值
 * @param patternType 模式类型
 * @returns 是否符合规则
 */
export const matchesPattern = (value: string, patternType: keyof typeof REGEX_RULES): boolean => {
  const pattern = REGEX_RULES[patternType];
  return pattern.test(value);
};

/**
 * 检查数值是否在范围内
 * @param value 要检查的值
 * @param rangeType 范围类型
 * @returns 是否在范围内
 */
export const isInRange = (value: number, rangeType: keyof typeof NUMBER_RANGE_RULES): boolean => {
  const range = NUMBER_RANGE_RULES[rangeType];
  return value >= range.min && value <= range.max;
};